package conservare.web;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import javax.persistence.NoResultException;

import org.primefaces.context.RequestContext;
import org.primefaces.event.FlowEvent;

import conservare.modelo.ItemDeDiaSemana;
import conservare.modelo.Pessoa;
import conservare.modelo.TipoLogradouro;
import conservare.modelo.UnidadeFederativa;
import conservare.modelo.contrato.Contrato;
import conservare.modelo.localservico.CondominioResCasa;
import conservare.modelo.localservico.CondominioResPredio;
import conservare.modelo.localservico.EstabelecimentoComercial;
import conservare.modelo.localservico.Igreja;
import conservare.modelo.localservico.LocalEmpresa;
import conservare.modelo.servico.AdministracaoCondominio;
import conservare.modelo.servico.LimpezaConservacao;
import conservare.modelo.servico.ServicoComplementar;
import conservare.modelo.type.DiaSemana;
import conservare.modelo.type.Periodicidade;
import conservare.modelo.type.Sexo;
import conservare.modelo.type.SituacaoContrato;
import conservare.modelo.type.TipoLocal;
import conservare.modelo.type.TipoPessoa;
import conservare.modelo.type.TipoServicoComplementar;
import conservare.modelo.type.TipoServicoPrincipal;
import conservare.negocio.ContratoRN;
import conservare.negocio.PessoaRN;
import conservare.negocio.TipoLogradouroRN;
import conservare.negocio.UnidadeFederativaRN;
import conservare.util.DataUtil;
import conservare.util.EnderecoUtil;
import conservare.util.JSFUtil;


@ManagedBean
@ViewScoped
public class ContratoBean implements Serializable{

	private static final long serialVersionUID = -6647219048786495573L;
	
	private List<TipoLogradouro> tiposLogradouros;
	private Integer qtdHorasDia;
	private Contrato contratoSelecionado;
	private List<Contrato> contratos;
	
	private List<SelectItem> tiposLocais;
	private List<SelectItem> tiposDeSexo;
	private List<SelectItem> periodicidades;
	private List<SelectItem> diasSemana;
	
	//private DualListModel<TipoServico> tiposDeServicos; 
	private Periodicidade periodicidadeSelecionada;
	
	private List<DiaSemana> diasSemanaSelecionado;
	private List<ItemDeDiaSemana> itensDeDiasSemanaDisponiveis;
	
	
	
	
	private List<UnidadeFederativa> ufs;
	private List<SelectItem> tipoClienteItens;
	private Integer idContratoSelecionado;
	private TipoPessoa tipoPessoaSelecionada;
	private TipoLocal tipoLocalSeleciondo;
	private Date dataDeCancelamentoDoContrato = new Date();
	private Date dataFimVigenciaContrato;
	private String motivoFimContrato = "";
	
	private List<SelectItem> tiposServicosPrincipaisDisponiveis;
	private TipoServicoPrincipal tipoServicoPrincipalSelecionado;
	
	
	private List<TipoServicoComplementarDeApoio> tiposServicosComplementaresDisponiveis = new ArrayList<>();
	private TipoServicoComplementar tiposServicoComplementarSelecionado;
	
	private List<SelectItem> diasSemanaLimpezaConservacaoDisponiveis;
	private List<DiaSemana> diasSemanaLimpezaConservacaoSelecionados;
	
	private Date quantidadeHorasDiaServicoLimpezaConservacao;
	
	
	@PostConstruct
	public void init(){
		
		Calendar calendar = Calendar.getInstance();  
        calendar.set(Calendar.AM_PM, Calendar.AM);  
        calendar.set(Calendar.HOUR, 1);  
        calendar.set(Calendar.MINUTE, 00);
        this.quantidadeHorasDiaServicoLimpezaConservacao = calendar.getTime();  
        
	}
	
	public void doAdicionarDiaNaAgendaLimpeza(ActionEvent event){
		
		if(getDiasSemanaSelecionado().size() > 0){
			for(DiaSemana diaSemana : getDiasSemanaSelecionado()){
				getContratoSelecionado().adicionarDiaNaAgendaServicoPrincipal(diaSemana, getQuantidadeHorasDiaServicoLimpezaConservacao());
			}
			getDiasSemanaSelecionado().clear();
			JSFUtil.addInfoMessage("Agenda atualizada com sucesso !");
		}
		
	}
	

/*	public void doAdicionarServicoComplementarNoContrato(ActionEvent event){
		
		if(getTiposServicosComplementaresSelecionados().size() > 0){
			for(TipoServicoComplementar tipoServicoComplementar : getTiposServicosComplementaresSelecionados()){
				getContratoSelecionado().adicionarServicoComplementar(tipoServicoComplementar, getPeriodicidadeSelecionada());
			}
			getDiasSemanaSelecionado().clear();
		}
		
	}*/
	
	public String doRemoverDiaNaAgendaLimpeza(ItemDeDiaSemana itemDeDiaSemanaRemover){
		
		getContratoSelecionado().removerDiaNaAgendaServicoPrincipal(itemDeDiaSemanaRemover);
		
		return null;
	}
	
	public String doRemoverServicoComplementarDoContrato(ServicoComplementar servicoComplementarRemover){
		
		getContratoSelecionado().removerServicoComplementarDoContrato(servicoComplementarRemover);
		
		return null;
	}

	public void doConfirmarCancelamentoContrato(ActionEvent event){
		
		new ContratoRN().cancelarContrato(getContratoSelecionado(), getMotivoFimContrato());
		JSFUtil.addInfoMessage("Contrato cancelado com sucesso !");
		
	}
	
	public void doAtivarContrato(ActionEvent event){
		
		if(camposObrigatorioDoContratoOk(getContratoSelecionado())){
			new ContratoRN().ativarContrato(getContratoSelecionado());
			JSFUtil.addInfoMessage("Contrato ativado !");
		}
		
	}
	
	private boolean camposObrigatorioDoContratoOk(Contrato contrato){
		
		boolean ok = true;
		
		if(contrato.getValorContrato().doubleValue() == 0.0){
			JSFUtil.addErrorMessage("Valor do contrato deve ser MAIOR que zero.");
			ok = false;
		}
		if(contrato.getDataInicioVigencia() == null){
			JSFUtil.addErrorMessage("Entre com a data de INICIO do serviço.");
			ok = false;
		}
		
		return ok;
	}
	
	public String doSalvarNovoContrato() {
		
		if(getTipoServicoPrincipalSelecionado() == TipoServicoPrincipal.ADMINISTRACAO_CONDOMINIO_RES_PREDIO && getTipoLocalSeleciondo() != TipoLocal.CONDOMINIO_RES_APARTAMENTO){
			JSFUtil.addInfoMessage("O tipo de serviço principal selecionado não se aplica ao tipo de local de prestação de serviço selecionado. Operação cancelada. !");
			return null;
		}
		
		
		
		if(getTipoLocalSeleciondo() == TipoLocal.CONDOMINIO_RES_APARTAMENTO){
			getContratoSelecionado().adiconarLocalPrestacaoServico((CondominioResPredio)getContratoSelecionado().getLocalPrestacaoServico());
		}else if(getTipoLocalSeleciondo() == TipoLocal.CONDOMINIO_RES_CASA){
			getContratoSelecionado().adiconarLocalPrestacaoServico((CondominioResCasa)getContratoSelecionado().getLocalPrestacaoServico());
		}else	 if(getTipoLocalSeleciondo() == TipoLocal.EMPRESA){
			getContratoSelecionado().adiconarLocalPrestacaoServico((LocalEmpresa)getContratoSelecionado().getLocalPrestacaoServico());
		}else if(getTipoLocalSeleciondo() == TipoLocal.ESTABELECIMENTO_COMERCIAL){
			getContratoSelecionado().adiconarLocalPrestacaoServico((EstabelecimentoComercial)getContratoSelecionado().getLocalPrestacaoServico());
		}else if(getTipoLocalSeleciondo() == TipoLocal.IGREJA){
			getContratoSelecionado().adiconarLocalPrestacaoServico((Igreja)getContratoSelecionado().getLocalPrestacaoServico());
		}else{
			JSFUtil.addInfoMessage("Local de prestação de serviço desconhecido. Operação cancelada ");
			return null;
		}
		
		if(getTipoServicoPrincipalSelecionado() == TipoServicoPrincipal.ADMINISTRACAO_CONDOMINIO_RES_PREDIO){
			getContratoSelecionado().adicionarServicoPrincipal(new AdministracaoCondominio());
		}else{ 
			getContratoSelecionado().adicionarServicoPrincipal(new LimpezaConservacao());
		}
		
		new ContratoRN().salvar(getContratoSelecionado());
		
		JSFUtil.addInfoMessage("Contrato salvo com sucesso !");
		return "listaContratos";
		
    }  
	
	public void doAtualizarContrato() {
		
		new ContratoRN().salvar(getContratoSelecionado());
		
		
	}
	
	public void doAtualizarContrato(ActionEvent event){
		doAtualizarContrato();
		JSFUtil.addInfoMessage("Contrato atualizado com sucesso !");
	}
	
	public String doIrParaPaginaListaContratos(){
		return "listaContratos";
	}
	
	public TipoLocal getTipoLocalSeleciondo() {
		return tipoLocalSeleciondo;
	}

	
	
	public void setTipoLocalSeleciondo(TipoLocal tipoLocalSeleciondo) {
		this.tipoLocalSeleciondo = tipoLocalSeleciondo;
		criarLocalParaEsteTipoDeServicoSelecionado(tipoLocalSeleciondo);
		//selecionarTiposDeServicosParaEsteTipoLocal(tipoLocalSeleciondo);
	}

	private void criarLocalParaEsteTipoDeServicoSelecionado(TipoLocal tipoLocalSeleciondo) {
		getContratoSelecionado().setLocalPrestacaoServico(tipoLocalSeleciondo.obterLocal());
	}

	/*private void selecionarTiposDeServicosParaEsteTipoLocal(TipoLocal tipoLocalSeleciondo) {
		
		List<TipoServico> tiposDeServicosSource = new ArrayList<TipoServico>();
		tiposDeServicosSource.add(TipoServico.JARDINAGEM);
		tiposDeServicosSource.add(TipoServico.LIMPEZA_CAIXA_DAGUA);
		tiposDeServicosSource.add(TipoServico.LIMPEZA_CAIXA_GORDURA);
		tiposDeServicosSource.add(TipoServico.LIMPEZA_CONSERVACAO);
		if(tipoLocalSeleciondo.equals(TipoLocal.CONDOMINIO_VERTICAL)){
			tiposDeServicosSource.add(TipoServico.ADMINISTRACAO_CONDOMINIO);
		}
		List<TipoServico> tiposDeServicosTarget = new ArrayList<TipoServico>();
		this.tiposDeServicos = new DualListModel<TipoServico>(tiposDeServicosSource, tiposDeServicosTarget);
	}*/

	
	public void cpfCnpjContratanteAlterado(ValueChangeEvent event){
		
		String numeroCpfCnpj = (String) event.getNewValue();
		
		Pessoa contratante = null;
		try {
			contratante = new PessoaRN().getByNumeroCpfCnpj(numeroCpfCnpj);
				//contratante = new PessoaRN().getNovo();
				//contratante.getCpfCnpj().setNumero(numeroCpfCnpj);
			getContratoSelecionado().setContratante(contratante);
		}catch (NoResultException e) {
			
		}
		
		
	}
	
	public boolean isPermitirDataFimPrestcaoServico(){
		boolean permitir = false;
		if(getContratoSelecionado() != null && getContratoSelecionado().getSituacao() == SituacaoContrato.ATIVO){
			permitir = true;
		}
		return permitir;
	}
	
	public String onFlowProcess(FlowEvent event) {  
        return event.getNewStep();  
    }  
	
	public String getDiasSemanaSelecionadoFormatado() {
		
		String retorno = "";
		if(getDiasSemanaSelecionado() != null){
			
			for (DiaSemana item : getDiasSemanaSelecionado()){
				if(retorno.isEmpty()){
					retorno = item.getDescricao();
				}else{
					retorno += " | " + item.getDescricao();
				}
			}
			
		}
		
		return retorno;
		
	}
	
	public void doConfirmarFimVigenciaContrato(ActionEvent actionEvent) {
		
		boolean isOk = true; 
		FacesMessage msg = null;
		
		if(getDataFimVigenciaContrato()!= null){
			Date dataFim = DataUtil.zerarHoraData(getDataFimVigenciaContrato()).getTime();
			Date dataInicio = DataUtil.zerarHoraData(getContratoSelecionado().getDataInicioVigencia()).getTime(); 
			if (!dataInicio.before(dataFim)) {
				msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Data final prestação serviço tem de ser MAIOR ou IGUAL a data inicio !", null);
				isOk = false;
			}else{
				new ContratoRN().finalizarPrestacaoServioDoContrato(getContratoSelecionado(), getDataFimVigenciaContrato(), getMotivoFimContrato());
				
				msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Fim de prestação de serviço salvo com sucesso !", null);
				isOk = true;
			}
			
		}
		
		FacesContext.getCurrentInstance().addMessage(null, msg); 
		RequestContext context = RequestContext.getCurrentInstance(); 
		context.addCallbackParam("isOk", isOk);  
		
	}
	
	
	public void copiarEnderecoEstabelecimentoParaContratante(ActionEvent actionEvent){
		EnderecoUtil.copiar(getContratoSelecionado().getLocalPrestacaoServico().getEndereco(), getContratoSelecionado().getContratante().getEndereco());
	}

	public Contrato getContratoSelecionado() {
		return contratoSelecionado;
	}

	public void setContratoSelecionado(Contrato contratoSelecionado) {
		this.contratoSelecionado = contratoSelecionado;
	}

	public List<Contrato> getContratos() {
		if(contratos == null){
			contratos = new ContratoRN().getTodos();
		}
		return contratos;
	}

	public void setContratos(List<Contrato> contratos) {
		this.contratos = contratos;
	}
	
	
	public List<TipoLogradouro> getTiposLogradouros() {
		if(tiposLogradouros == null){
			setTiposLogradouros(new TipoLogradouroRN().getTodos());
		}
		return tiposLogradouros;
	}

	public void setTiposLogradouros(List<TipoLogradouro> tiposLogradouros) {
		this.tiposLogradouros = tiposLogradouros;
	}

	public List<SelectItem> getTipoLocais() {
		if(tiposLocais == null){
			tiposLocais = new ArrayList<SelectItem>();
			this.tiposLocais.add(new SelectItem(null," "));
			for (TipoLocal tipo : TipoLocal.values())
				this.tiposLocais.add(new SelectItem(tipo,tipo.toString()));
		}
		return tiposLocais;
	}
	
	public List<SelectItem> getTipoClienteItens() {
		if(tipoClienteItens == null){
			tipoClienteItens = new ArrayList<SelectItem>();
			for (TipoPessoa item : TipoPessoa.values())
				tipoClienteItens.add(new SelectItem(item,item.getDescricao()));
		}
		return tipoClienteItens;
	}

	
	/*public DualListModel<TipoServico> getTiposDeServicos() {
		
		List<TipoServico> tiposDeServicosSource = new ArrayList<TipoServico>();
		
		tiposDeServicosSource.add(TipoServico.JARDINAGEM);
		tiposDeServicosSource.add(TipoServico.LIMPEZA_CAIXA_DAGUA);
		tiposDeServicosSource.add(TipoServico.LIMPEZA_CAIXA_GORDURA);
		tiposDeServicosSource.add(TipoServico.LIMPEZA_CONSERVACAO);
		tiposDeServicosSource.add(TipoServico.ADMINISTRACAO_CONDOMINIO)
		
		List<TipoServico> tiposDeServicosTarget = new ArrayList<TipoServico>();
		this.tiposDeServicos = new DualListModel<TipoServico>(tiposDeServicosSource, tiposDeServicosTarget);
		
		return tiposDeServicos;
		
		
	}*/

	/*public void setTiposDeServicos(DualListModel<TipoServico> tiposDeServicos) {
		this.tiposDeServicos = tiposDeServicos;
	}*/

	public List<SelectItem> getTiposDeSexo() {
		if(tiposDeSexo == null){
			tiposDeSexo = new ArrayList<SelectItem>();
			for (Sexo item : Sexo.values())
				this.tiposDeSexo.add(new SelectItem(item,item.getDescricao()));//value - label
		}
		return tiposDeSexo;
	}
	
	public List<SelectItem> getPeriodicidades() {
		
		if(periodicidades == null){
			periodicidades = new ArrayList<SelectItem>();
			
			for (Periodicidade item :  Periodicidade.values())
				this.periodicidades.add(new SelectItem(item,item.getDescricao()));//value - label
		}
		return periodicidades;
	}


	public List<UnidadeFederativa> getUfs() {
		if(this.ufs == null){
			this.ufs = new UnidadeFederativaRN().getTodos();
		}
		return ufs;
	}
	
	public List<SelectItem> getDiasSemana() {
		
		if(diasSemana == null){
			diasSemana = new ArrayList<SelectItem>();
			for (DiaSemana item : DiaSemana.values())
				this.diasSemana.add(new SelectItem(item,item.getDescricao()));
		}
		return diasSemana;
		
	}

	public List<DiaSemana> getDiasSemanaSelecionado() {
		if(diasSemanaSelecionado == null){
			diasSemanaSelecionado = new ArrayList<DiaSemana>();
		}
		return diasSemanaSelecionado;
	}

	public void setDiasSemanaSelecionado(List<DiaSemana> diasSemanaSelecionado) {
		this.diasSemanaSelecionado = diasSemanaSelecionado;
	}

	
	public List<ItemDeDiaSemana> getItensDeDiasSemanaDisponiveis() {
		if(itensDeDiasSemanaDisponiveis == null){
			itensDeDiasSemanaDisponiveis = new ArrayList<>();
			for (DiaSemana diaSemana : DiaSemana.values()){
				itensDeDiasSemanaDisponiveis.add(new ItemDeDiaSemana(diaSemana));
			}
		}
		return itensDeDiasSemanaDisponiveis;
	}

	/*public void setItensDeDiasSemanaDisponiveis(
			List<ItemDeDiaSemana> itensDeDiasSemanaDisponiveis) {
		this.itensDeDiasSemanaDisponiveis = itensDeDiasSemanaDisponiveis;
	}*/

	public Integer getQtdHorasDia() {
		return qtdHorasDia;
	}


	public void setQtdHorasDia(Integer qtdHorasDia) {
		this.qtdHorasDia = qtdHorasDia;
	}


	public Integer getIdContratoSelecionado() {
		return idContratoSelecionado;
	}


	public void setIdContratoSelecionado(Integer idContratoSelecionado) {
		this.idContratoSelecionado = idContratoSelecionado;
	}

	public Date getDataDeCancelamentoDoContrato() {
		return dataDeCancelamentoDoContrato;
	}

	public void setDataDeCancelamentoDoContrato(Date dataDeCancelamentoDoContrato) {
		this.dataDeCancelamentoDoContrato = dataDeCancelamentoDoContrato;
	}


	public String getMotivoFimContrato() {
		return motivoFimContrato;
	}

	public void setMotivoFimContrato(String motivoFimContrato) {
		this.motivoFimContrato = motivoFimContrato;
	}

	public Date getDataFimVigenciaContrato() {
		return dataFimVigenciaContrato;
	}

	public void setDataFimVigenciaContrato(Date dataFimVigenciaContrato) {
		this.dataFimVigenciaContrato = dataFimVigenciaContrato;
	}

	public List<SelectItem> getTiposLocais() {
		return tiposLocais;
	}

	public void setTiposLocais(List<SelectItem> tiposLocais) {
		this.tiposLocais = tiposLocais;
	}

	public TipoPessoa getTipoPessoaSelecionada() {
		return tipoPessoaSelecionada;
	}

	public void setTipoPessoaSelecionada(TipoPessoa tipoPessoaSelecionada) {
		this.tipoPessoaSelecionada = tipoPessoaSelecionada;
	}

	public void setTiposDeSexo(List<SelectItem> tiposDeSexo) {
		this.tiposDeSexo = tiposDeSexo;
	}

	public void setPeriodicidades(List<SelectItem> periodicidades) {
		this.periodicidades = periodicidades;
	}

	public void setDiasSemana(List<SelectItem> diasSemana) {
		this.diasSemana = diasSemana;
	}

	public void setUfs(List<UnidadeFederativa> ufs) {
		this.ufs = ufs;
	}

	public void setTipoClienteItens(List<SelectItem> tipoClienteItens) {
		this.tipoClienteItens = tipoClienteItens;
	}

	
	/*public LocalPrestacaoServico getLocalPrestacaoServicoSelecionado() {
		return localPrestacaoServicoSelecionado;
	}

	public void setLocalPrestacaoServicoSelecionado(
			LocalPrestacaoServico localPrestacaoServicoSelecionado) {
		this.localPrestacaoServicoSelecionado = localPrestacaoServicoSelecionado;
	}

	public Pessoa getContratanteSelecionado() {
		return contratanteSelecionado;
	}

	public void setContratanteSelecionado(Pessoa contratanteSelecionado) {
		this.contratanteSelecionado = contratanteSelecionado;
	}*/

	public List<SelectItem> getTiposServicosPrincipaisDisponiveis() {
		
		if(tiposServicosPrincipaisDisponiveis == null){
			tiposServicosPrincipaisDisponiveis = new ArrayList<SelectItem>();
			for (TipoServicoPrincipal tipo : TipoServicoPrincipal.values())
				this.tiposServicosPrincipaisDisponiveis.add(new SelectItem(tipo,tipo.toString()));
		}
		
		return tiposServicosPrincipaisDisponiveis;
		
	}
	
	
	/*public List<SelectItem> getTiposServicosComplementaresDisponiveis() {
		
		if(tiposServicosComplementaresDisponiveis == null){
			tiposServicosComplementaresDisponiveis = new ArrayList<SelectItem>();
			for (TipoServicoComplementar tipo : TipoServicoComplementar.values())
				this.tiposServicosComplementaresDisponiveis.add(new SelectItem(tipo,tipo.toString())); // value, label
		}
		
		return tiposServicosComplementaresDisponiveis;
		
	}*/
	
	
	
	public List<SelectItem> getDiasSemanaLimpezaConservacaoDisponiveis() {
		
		if(diasSemanaLimpezaConservacaoDisponiveis == null){
			diasSemanaLimpezaConservacaoDisponiveis = new ArrayList<>();
			for (DiaSemana item : DiaSemana.values())
				this.diasSemanaLimpezaConservacaoDisponiveis.add(new SelectItem(item,item.getDescricao()));
		}
		
		return diasSemanaLimpezaConservacaoDisponiveis;
		
	}
	
	public List<TipoServicoComplementarDeApoio> getTiposServicosComplementaresDisponiveis() {
		if(tiposServicosComplementaresDisponiveis.size() == 0){
			for (TipoServicoComplementar tsc : TipoServicoComplementar.values()){
				tiposServicosComplementaresDisponiveis.add(new TipoServicoComplementarDeApoio(tsc));
			}
				
		}
		return tiposServicosComplementaresDisponiveis;
	}

	public TipoServicoPrincipal getTipoServicoPrincipalSelecionado() {
		return tipoServicoPrincipalSelecionado;
	}

	public void setTipoServicoPrincipalSelecionado(
			TipoServicoPrincipal tipoServicoPrincipalSelecionado) {
		this.tipoServicoPrincipalSelecionado = tipoServicoPrincipalSelecionado;
	}

/*	public List<TipoServicoComplementar> getTiposServicosComplementaresSelecionados() {
		return tiposServicosComplementaresSelecionados;
	}

	public void setTiposServicosComplementaresSelecionados(List<TipoServicoComplementar> tiposServicosComplementaresSelecionados) {
		this.tiposServicosComplementaresSelecionados = tiposServicosComplementaresSelecionados;
	}*/

	
	
	public List<DiaSemana> getDiasSemanaLimpezaConservacaoSelecionados() {
		if(diasSemanaLimpezaConservacaoSelecionados == null){
			diasSemanaLimpezaConservacaoSelecionados = new ArrayList<DiaSemana>();
		}
		return diasSemanaLimpezaConservacaoSelecionados;
	}

	public TipoServicoComplementar getTiposServicoComplementarSelecionado() {
		return tiposServicoComplementarSelecionado;
	}

	public void setTiposServicoComplementarSelecionado(TipoServicoComplementar tiposServicoComplementarSelecionado) {
		this.tiposServicoComplementarSelecionado = tiposServicoComplementarSelecionado;
	}

	public void setDiasSemanaSelecionados(List<DiaSemana> diasSemanaSelecionados) {
		this.diasSemanaLimpezaConservacaoSelecionados = diasSemanaSelecionados;
	}
	
	public Date getQuantidadeHorasDiaServicoLimpezaConservacao() {
		return quantidadeHorasDiaServicoLimpezaConservacao;
	}

	public void setQuantidadeHorasDiaServicoLimpezaConservacao(Date quantidadeHorasDiaServicoLimpezaConservacao) {
		this.quantidadeHorasDiaServicoLimpezaConservacao = quantidadeHorasDiaServicoLimpezaConservacao;
	}

	
	
	/*
	public void timeSelectListener(TimeSelectEvent timeSelectEvent) {  
        FacesMessage msg =  
            new FacesMessage(FacesMessage.SEVERITY_INFO, "Time select fired",  
                             "Selected time: " + getFormattedTime(timeSelectEvent.getTime(), "HH:mm"));  
        FacesContext.getCurrentInstance().addMessage(null, msg);  
    }  
  
    public void beforeShowListener(BeforeShowEvent beforeShowEvent) {  
        FacesMessage msg =  
            new FacesMessage(FacesMessage.SEVERITY_INFO, "Before show fired",  
                             "Component id: " + beforeShowEvent.getComponent().getId());  
        FacesContext.getCurrentInstance().addMessage(null, msg);  
    }  
  
    public void closeListener(CloseEvent closeEvent) {  
        FacesMessage msg =  
            new FacesMessage(FacesMessage.SEVERITY_INFO, "Close fired", "Component id: " + closeEvent.getComponent().getId());  
        FacesContext.getCurrentInstance().addMessage(null, msg);  
    }  
  
    private String getFormattedTime(Date time, String format) {  
        if (time == null) {  
            return null;  
        }  
  
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);  
  
        return simpleDateFormat.format(time);  
    }  
	*/
	
	
	
	
	
	
	
	
	
	public Periodicidade getPeriodicidadeSelecionada() {
		return periodicidadeSelecionada;
	}

	public void setPeriodicidadeSelecionada(Periodicidade periodicidadeSelecionada) {
		this.periodicidadeSelecionada = periodicidadeSelecionada;
	}

	public void editar() {
		if (idContratoSelecionado == null) {
			return;
		}else if(getContratoSelecionado() == null){
			setContratoSelecionado(new ContratoRN().getById(idContratoSelecionado));
			if(getContratoSelecionado().getServicoPrincipal().getAgendaSemanal() != null && getContratoSelecionado().getServicoPrincipal().getAgendaSemanal().size() > 0){
				for(ItemDeDiaSemana itemDeDiaSemana : getContratoSelecionado().getServicoPrincipal().getAgendaSemanal()){
					getDiasSemanaLimpezaConservacaoSelecionados().add(itemDeDiaSemana.getDiaSemana());
				}
				
				//Quantidade de horas dia. Apenas um já basta.
				setQuantidadeHorasDiaServicoLimpezaConservacao(getContratoSelecionado().getServicoPrincipal().getAgendaSemanal().get(0).getQtdHorasDia());
			}
		}
	}

	
	public void incluir() {
		if(getContratoSelecionado() == null){
			setContratoSelecionado(new ContratoRN().criarNovoContrato());
			//setLocalPrestacaoServicoSelecionado(new LocalPrestacaoServicoRN().getNovoLocal());
		}
	}
	
	//Inner Class
	public class TipoServicoComplementarDeApoio{
		
		private TipoServicoComplementar tipoServicoComplementar;
		private Periodicidade periodicidade;
		
		public TipoServicoComplementarDeApoio(){
			
		}
		public TipoServicoComplementarDeApoio(TipoServicoComplementar tipoServicoComplementar){
			this.tipoServicoComplementar = tipoServicoComplementar;
		}
		public Periodicidade getPeriodicidade() {
			return periodicidade;
		}
		public void setPeriodicidade(Periodicidade periodicidade) {
			this.periodicidade = periodicidade;
		}
		public String getDescricao() {
			return tipoServicoComplementar.getDescricao();
		}
		
		public String adicionarServicoComplementarNoContrato(){
			
			boolean isExiste = getContratoSelecionado().isServicoComplementarExisteNoContrato(this.tipoServicoComplementar);
			
			getContratoSelecionado().adicionarServicoComplementar(this.tipoServicoComplementar, this.periodicidade);
			JSFUtil.addInfoMessage(this.tipoServicoComplementar.getDescricao() + " foi " + (isExiste == true ? "ATUALIZADO" : "ADICIONADO")  + " com Sucesso !");
			return null;
		}
		
	}
}
